package demo2;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
/**
 * DAO:Data Access Object
 * 数据访问对象
 *
 * 模式使用当前类链接数据库，对user表进行操作
 * 要连接数据库需要的三个信息:
 * 数据库的地址，用户名和密码。
 * 此时我们可以在当前类中用三个属性定义这三个信息，让Spring在创建当前对象同时对属性初始化
 */
@Component
/**
 * @PropertySource注解用于告知Spring容器需要加载一个配置文件
 * ()中参数用于指定配置文件所在的位置。
 * 常用格式:
 * classpath:文件名
 *
 * classpath(类路径)，这里这样的写法“classpath:”指的时后面指定的文件在类路径中
 * 这里类路径指的是JVM读取.class文件时的起始路径，也称为"类加载路径"
 * 背景知识:
 * 在Maven项目中，源代码放在:
 * src/main
 *        -/java            这里存所有的.java原文件以及对应的包
 *        -/resources       其他的资源文件
 *
 * 当maven项目编译后，上述两个路径中的内容会整合在一起统一放在:
 * target/classes
 * 这个目录就是JVM的类加载路径，从这里开始顺着我们类定义的包可以找到对应的字节码文件
 *
 * 那么:
 * 我们定义了一个配置文件:config.properties,我们将其放在src/main/resources中，当maven项目
 * 编译后该文件保存在target/classes中。
 * 因此在类加载路径的起始位置应当就能看到名为config.properties文件
 *
 * Spring容器既可以找到对应的配置文件，然后使用上面定义的配置项配合@Value注解初始化属性
 *
 */
@PropertySource("classpath:config.properties")
public class UserDAO {
    /*
        @Value注解是Spring框架提供的，用于为属性值进行初始化的
        当Spring框架在创建当前UserDAO实例时会用@Value注解为属性赋值

        在@Value注解中有两种用法:
        1:直接将值指定,实际开发并不推荐这样的写法,因为不灵活
        2:引用外部的资源文件(@PropertySource注解指明配置文件的位置)
          格式:@Value("${...}")

          ${}中书写properties文件中的name,那么Spring框架会将该文件中这个name对应的value
          初始化对应的属性

          例如:
          config.properties文件内容:
          spring.datasource.url=jdbc:mysql://localhost:3360/blog
          spring.datasource.username=root
          spring.datasource.password=root

          那么:
          @Value("${spring.datasource.url}")
          private String url;

          Spring容器在初始化当前UserDAO时,会将配置文件中"spring.datasource.url"对应
          的值"jdbc:mysql://localhost:3360/blog"来初始化url这个属性

          实际开发中,当我们在一个类中需要使用一个值,而这个值可能随着实际应用业务的变化而改变时
          那么这个值就不应当写死在程序中,而是像现在演示的一样用配置文件进行配置,以避免因为变化
          带来的源代码修改(这会导致实际生产环境中只能重新编译代码重新部署,增加维护成本和复杂度)

     */
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    @Value("${spring.datasource.url}")
    private String url;

    @Override
    public String toString() {
        return "UserDAO{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", url=" + url +
                '}';
    }
}
